package com.itlong.cloud.dao;

import com.itlong.cloud.POJO.DTO.smartcard.SmartCardSyncDataPullUserBasisInfoDTO;
import com.itlong.cloud.POJO.PO.SmartCardPullPO;
import com.itlong.cloud.POJO.PO.TimeTaskPullRemoveRepeatPO;
import com.itlong.cloud.POJO.VO.smartcard.SmartCardPullTableInfoVO;
import com.itlong.cloud.abstracts.IAbstractBaseDao;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      与旺龙一卡通对接-操作一卡通pull云端的数据访问接口
 * </desc>
 *
 * @createDate 2017-11-01
 */
@Mapper
@Repository
public interface ISmartCardSyncDataPullDao extends IAbstractBaseDao<SmartCardPullPO> {
    /**
     * <desc>
     *      创建一个独立的pull表(smartcard_pull_cloud_projectId)
     * </desc>
     * @param tableName 表名
     * @return
     * @author zhangs
     * @createDate 2017/11/1
     */
    void createPullTable(@Param("tableName") String tableName);



    /**
     * <desc>
     *      存储项目中各处数据更改点传输过来的数据
     * <desc/>
     *
     * @param tableName 表名
     * @param smartCardPullPOS 待推送一卡通的数据
     * @return
     * @author zhangs
     * @createDate 2017/11/3
     */
    Integer batchSavePullData(@Param("tableName") String tableName,
                              @Param("smartCardPullPOS") List<SmartCardPullPO> smartCardPullPOS);


    /**
     * <desc>
     *    保存推送给一卡通的数据.
     * </desc>
     *
     * @param tableName 表名
     * @param smartCardPullPO 待保存的数据
     * @return 受影响的行数
     * @author LewisLouis
     * @createDate 2017-12-21
     */
    Integer savePullData(@Param("tableName") String tableName, @Param("smartCardPullPO") SmartCardPullPO smartCardPullPO);

    /**
     * <desc>
     *      条件查询推送给一卡通的数据
     * </desc>
     * @param tableName 表名
     * @param smartCardPullPO 查询条件
     * @return 受影响的行数
     * @author LewisLouis
     * @createDate 2017-12-21
     */
    List<SmartCardPullPO> getPullData(@Param("tableName") String tableName, @Param("smartCardPullPO") SmartCardPullPO smartCardPullPO);




    /**
    * <desc>
    *    更新推送给一卡通的数据.
    * </desc>
    *
     * @param tableName 表名
     * @param smartCardPullPO 待更新数据
    * @return xx
    * @author LewisLouis
    * @createDate 2017-12-21
    */

    Integer updatePullData(@Param("tableName") String tableName, @Param("smartCardPullPO") SmartCardPullPO smartCardPullPO);


    /**
    * <desc>
    *     批量更新推送给一卡通的数据状态为已同步.
    * </desc>
    *
    * @param  * @param null
    * @return xx
    * @author LewisLouis
    * @createDate 2017-12-25
    */
    Integer batchUpdatePullDataSyncStatus(@Param("tableName") String tableName,
                                          @Param("lastSyncSerailNoList") List<String> lastSyncSerailNoList);





    /**
    * <desc>
    *    根据用户Id获取用户手机号.
    * </desc>
    *
    * @param userId 用户Id
    * @return 用户手机号
    * @author LewisLouis
    * @createDate 2017-12-21
    */
    String getUserPhoneByUserId(@Param("userId") String userId);


    /**
    * <desc>
    *     查询App用户项目基本信息-.
    * </desc>
    *
    * @param  projectId 项目Id
    * @param  userId 用户Id
    * @return 查询结果集
    * @author LewisLouis
    * @createDate 2017-12-22
    */
    List<SmartCardSyncDataPullUserBasisInfoDTO> getUserBasisInfo(@Param("projectId") String projectId, @Param("userId") String userId);

    /**
     * <desc>
     *      将同步流水号更新到对应数据中
     * </desc>
     * @param params 查询条件
     * @return
     * @author zhangs
     * @createDate 2017/11/1
     */
    Integer updateSerialByIds(Map<String, Object> params);



    /**
     * <desc>
     *     更新pull表中已同步数据的同步状态
     * <desc/>
     *
     * @param params 条件
     * @return
     * @author zhangs
     * @createDate 2017/11/3
     */
    Integer updatePullDataSyncStatus(Map<String, Object> params);

    /**
     * <desc>
     *     整理Pull表中数据的定时任务获取有数据变动的pull表
     * <desc/>
     *
     * @param param 查询条件
     * @return List<TimeTaskPullRemoveRepeatPO> 定时任务临时表数据集
     * @author zhangs
     * @createDate 2017/11/3
     */
    List<TimeTaskPullRemoveRepeatPO> obtainPullTableName(Map<String, Object> param);

    /**
     * <desc>
     *     更新记录pull表有数据变动的定时任务表中的状态
     * <desc/>
     *
     * @param timeTaskPullRemoveRepeatPO 存储有数据变化的pull表信息的定时任务临时表
     * @return
     * @author zhangs
     * @createDate 2017/11/8
     */
    void updatePullTableStatus(TimeTaskPullRemoveRepeatPO timeTaskPullRemoveRepeatPO);

    /**
     * <desc>
     *      存储有数据变化的pull表信息的定时任务临时表
     * <desc/>
     *
     * @param timeTaskPullRemoveRepeatPO 存储有数据变化的pull表信息的定时任务临时表
     * @return 影响的数据数量
     * @author zhangs
     * @createDate 2017/11/3
     */
    Integer savePullTableName(TimeTaskPullRemoveRepeatPO timeTaskPullRemoveRepeatPO);

    /**
     * <desc>
     *     定时任务获取pull表中未处理的数据
     * <desc/>
     *
     * @param smartCardPullPO 查询条件
     * @return List<SmartCardPullPO> 旺龙一卡通需要pull的数据集
     * @author zhangs
     * @createDate 2017/11/3
     */
    List<SmartCardPullPO> getUnhandledData(SmartCardPullPO smartCardPullPO);

    /**
     * <desc>
     *      根据Id删除对应数据
     * <desc/>
     *
     * @param list 需要删除的pull表的Id集
     * @return
     * @author zhangs
     * @createDate 2017/11/3
     */
    Integer delPullDataByIds(List<Integer> list);

    /**
     * <desc>
     *      根据Id更新对应数据
     * <desc/>
     *
     * @param tableName 表名
     *  @param  id 数据Id
     * @return
     * @author zhangs
     * @createDate 2017/11/3
     */
//    Integer updatePullDataById(@Param("tableName")String tableName, @Param("id") Integer id);

    /**
     * <desc>
     *    将已处理的云端同步到一卡通到数据进行转移.
     * </desc>
     *
     * @param tableName push表
     * @return xx
     * @author LewisLouis
     * @createDate 2018-01-26
     */
    void movePullDataToColdTable(@Param("tableName") String tableName);


    /**
     * <desc>
     *    删除已转移的云端同步到一卡通的数据
     * </desc>
     *
     * @param tableName push表
     * @return xx
     * @author LewisLouis
     * @createDate 2018-01-09
     */
    void removePullData(@Param("tableName") String tableName);


    /**
    * <desc>
    *    获取所有一卡通pul表的信息，用于分析是否需要清理.
    * </desc>
    *
    * @param
    * @return xx
    * @author LewisLouis
    * @createDate 2018-01-26
    */
    List<SmartCardPullTableInfoVO> getAllPullTablesInfo();
}
